package javaapplication1;

/**
 *
 * @author Roman Shuplov<AstRonin@gmail.com>
 */
public class VarMask {


    private StringBuffer stringBuffer;


    public VarMask(){
        stringBuffer = new StringBuffer();
    }



    public boolean mask(String data, String mask){

        stringBuffer.setLength(0);

        if ( mask.equals("all") ) { // Все закрыть
            stringBuffer.append(asterisk4());
            return true;
        }
        if ( mask.equals("none") ) { // Все открыть
            stringBuffer.append(data);
            return true;
        }


        
        int strlen_mask = mask.length();
        if ( 0 < strlen_mask && 2 >= strlen_mask ) { // Если только цифра, то закрыть с начала
            return parseBegin(data, Integer.parseInt(mask), false);
        }



        
        boolean str_begin = ( mask.indexOf("begin") > -1 ) ? true : false; // С начала
        boolean str_end   = ( mask.indexOf("end") > -1 )   ? true : false; // В конце
        boolean reverse   = ( mask.indexOf("none") > -1 )  ? true : false; // Реверсия, меняет "закрыть" на "оставить открытыми и закрыть остольное"


        if ( str_begin && str_end ) {
            return parse2Size(data, mask, reverse);
        }
        if ( str_begin ) {
            return parseBegin(data, Integer.parseInt(mask.substring(0,1)), reverse);
        }
        if ( str_end ) {
            return parseEnd(data, Integer.parseInt(mask.substring(0,1)), reverse);
        }




        return true;
    }




    
    private boolean parseBegin(String data, int asteriskCount, boolean reverse){
        if (!reverse) {
            stringBuffer.append(strRepeat('*', asteriskCount));
            stringBuffer.append(data.substring(asteriskCount));
            return true;
        }
        stringBuffer.append(data.substring(0, asteriskCount));
        stringBuffer.append(asterisk4());
        return true;
    }


    private boolean parseEnd(String data, int asteriskCount, boolean reverse){
        if (!reverse) {
            stringBuffer.append(data.substring(0, data.length()-asteriskCount));
            stringBuffer.append(strRepeat('*', asteriskCount));
            return true;
        }
        stringBuffer.append(asterisk4());
        stringBuffer.append(data.substring(data.length()-asteriskCount));
        return true;
    }


    private boolean parse2Size(String data, String mask, boolean reverse){

        String[] array_mask = mask.split(" ");
        int asterisk_count1 = Integer.parseInt(array_mask[0]);
        int asterisk_count2 = Integer.parseInt(array_mask[2]);

        if (!reverse) {
            stringBuffer.append(strRepeat('*', asterisk_count1));
            stringBuffer.append(data.substring(asterisk_count1, data.length() - asterisk_count2));
            stringBuffer.append(strRepeat('*', asterisk_count2));
            return true;
        }
        stringBuffer.append(data.substring(0, asterisk_count1));
        stringBuffer.append(asterisk4());
        stringBuffer.append(data.substring(data.length()-asterisk_count2));
        return true;
    }






    private static String strRepeat(char a, int num){
        StringBuffer s = new StringBuffer();
        for (int i = 0; i<num; i++) s.append(a);
        return s.toString();
    }


    private static String asterisk4(){
        return "****";
    }


    public String getNewString(){
        return stringBuffer.toString();
    }





    
}
